print('''有三个骰子，每次一起抛出，如果假定最初有400个筹码，三个骰子的点数之和大于10算赢，小于等于10算输，每次输赢一个筹码，
输入随机赌局数并预测结果。
（系统会用随机函数模拟抛掷n次，反馈最后结果以及胜局分布如何）''')

import numpy as np
import random

np.random.seed(7)  # 注释该行，使每次测试都有变化
i = 0
while i < 1:#设置了输入异常处理语句 嘻嘻
    try:
        num = input('请输入赌局数：（正整数）')  # 使用者输入抛掷总数
        num = int(num)  # 将字符串转化为整数（以便计算机计算）
        i = i+1
    except Exception:
        print('ERROR')
else:
    dice = np.random.randint(1, 7, size=(num, 3))  # 产生1000X3数组dice，随机整数范围【1,6】，注意函数中要写为7
    dice = np.column_stack((dice, dice.sum(axis=1)))  # 计算三个骰子的点数之和，添加到dice末尾列(添加新维度）（形成1000X4的数组）
    point = dice[:, 3]  # 取点数之和列

    money = 400  # 初始筹码数
    bep = 10  # >10赢,<=10输
    print('\n初始筹码：', money, '，盈亏点：', bep, '，每次输赢为1')
    total = money + (point > bep).sum() - (point <= bep).sum()  # 最后筹码的计算函数
    print('最后筹码', total)

    if total > money:
        print('结局：VICTORY')
    elif total < money:
        print('结局：DEFEAT')
    else:
        print('结局：DRAW')

    print('--------------------------------------------------')
    dice = np.column_stack((dice, np.where(dice[:, 3] > bep, 1, -1)))  # 用np.where判断每次输赢，返回1，-1构成的每次盈亏列，添加到末尾，变为1000X5
    dice = np.column_stack((dice, np.cumsum(dice[:, 4])))  # 用np.cumsum累加每次盈亏，得到的累积盈亏列添加到末尾列，变为1000X6
    dice = np.column_stack((dice, dice[:, 5] + money))  # 用累积盈亏列加初始筹码，得到当前筹码，添加到末尾列，变为1000X7
    s = '曾经的最高筹码数{}，出现在第{}次'
    print(s.format(np.max(dice[:, 6]), np.argmax(dice[:, 6])))
    s = '曾经的最低筹码数{}，出现在第{}次'
    print(s.format(np.min(dice[:, 6]), np.argmin(dice[:, 6])))
    print('--------------------------------------------------')

    b = (point > 10).sum()
    print('胜局次数', b)  # 胜局次数
    a = np.where(point > 10)
    print('在第x次胜利', a)  # 返回胜局出现的局次

    print('-------------绘图----------------')
    import matplotlib.pyplot as plt  # 引入绘图库

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 制定中文黑体字体
    plt.xticks(fontsize=14)  # 设置x轴文字大小
    plt.yticks(fontsize=14)  # 设置y轴文字大小
    plt.title('胜局分布和筹码变化', fontsize=16)  # 设置标题文字
    plt.plot(dice[:, -1])  # 绘制函筹码变化折线图

    arr = a  # 设置用于绘制直方图的一维数组a（画胜局分布的直方图）
    plt.hist(arr, bins=5, density=0, edgecolor='k')  # 绘制胜局分布直方图，设置柱数为5，并显示频数
    plt.show()  # 显示绘图